﻿package com.eitb.programas.menu {
	import flash.net.*;
	import flash.geom.*;
	import flash.events.*;
	import flash.display.*;
	import com.eitb.botones.*;
	import com.eitb.programas.menu.botones.*;
	import com.eitb.factorias.*;
	import com.eitb.plantillas.*;
	import com.eitb.cargadores.*;
	import com.google.maps.*;
	import com.eitb.literales.*;
	public class ModeloMenu implements IControladorMenu {
		private var vMenu:IVistaMenu;

		private static  const MENU_HEIGHT:Number = 32.5;
		private static  const ESPACIO_ENTRE_BOTONES:int = 5;
		private static  var NUMERO_DE_BOTONES:int = 6;

		private var laminas:Array;
		private var idioma:int;

		public function ModeloMenu():void {
			this.laminas = new Array();
		}
		
		public function initIdioma(idioma:int):void {
			this.idioma = idioma;
		}
		
		// IControladorMenus
		public function initVistaMenu(v:IVistaMenu):void {
			this.vMenu = v;
		}

		public function reposarBotones():void {
			for each (var lamina in this.laminas) {
				lamina.getBotonVista().reposo();
			}
		}
		public function ocultarPlantillas():void {
			for each (var lamina:Lamina in this.laminas) {
				lamina.getPlantillaVista().setVisible(lamina.getBotonControlador().isSeleccionado());
			}
		}
		public function loadImagenes():void {
			for each (var lamina:Lamina in this.laminas) {
				if (lamina.getBotonControlador().isSeleccionado()) {
					if (lamina.getPlantillaControlador() is ModeloPlantillaMultimedia || lamina.getPlantillaControlador() is ModeloGaleria) {
						lamina.getPlantillaControlador().loadImagenes();
						break;
					}
				}
			}
		}
		// IControladorMenus
		
		public function initLaminas(laminasXml:XMLList):void {
			var botones:Array = new Array();
			var plantillas:Array = new Array();
			this.laminas = this.generarArrayLaminas(laminasXml);
			for each (var lamina in this.laminas) {
				botones.push(lamina.getBotonVista());
				plantillas.push(lamina.getPlantillaVista());
			}
			ModeloMenu.NUMERO_DE_BOTONES = this.laminas.length;
			this.pintarBotones(botones);
			this.pintarPlantillas(plantillas)			
			this.pintarPlantilla(0);
		}

		private function pintarPlantilla(numero:int):void {
			this.laminas[numero].getBotonControlador().setSeleccionado(true);
			this.laminas[numero].getBotonVista().seleccionado();
			this.ocultarPlantillas();
			this.loadImagenes();
		}
		
		
		public function setVisibleBoton(mostrar:Boolean):void {
			for each (var lamina:Lamina in this.laminas) {
				if (lamina.getBotonControlador().isSeleccionado()) {
					lamina.getPlantillaVista().setVisible(mostrar);
				} else {
					lamina.getPlantillaVista().setVisible(false);
				}
			}
		}
		
		private function generarArrayLaminas(laminasXml:XMLList):Array {
			var lamina:Lamina;
			
			var dBoton:*;
			var mBoton:*;
			
			var dPlantilla:*;
			var mPlantilla:*;

			var factoriaBotones:IFactoria = new FactoriaBotones();
			var factoriaPlantillas:IFactoria = new FactoriaPlantillas();

			var tmp:Array = new Array();
			for each (var laminaXml in laminasXml) {
				lamina = new Lamina();

				dBoton = factoriaBotones.getVistaElemento(laminaXml.boton.tipo);
				mBoton = new ModeloBoton();
				this.vMenu.addStageChild(dBoton);

				dBoton.initControladorBoton(mBoton);
				dBoton.initControladorMenu(this);
				dBoton.initTextos(laminaXml.boton.textos);
				mBoton.initVistaBoton(dBoton);

				dPlantilla = factoriaPlantillas.getVistaElemento(laminaXml.plantilla.tipo);
				mPlantilla = factoriaPlantillas.getControladorElemento(laminaXml.plantilla.tipo);
				this.vMenu.addStageChild(dPlantilla);				

				dPlantilla.initControladorPlantilla(mPlantilla);
				mPlantilla.initVistaPlantilla(dPlantilla);

				switch (laminaXml.plantilla.tipo.toString()) {
					case FactoriaPlantillas.PLANTILLA_1X2 :
					case FactoriaPlantillas.PLANTILLA_2X1 :
					case FactoriaPlantillas.PLANTILLA_3X2 :
					case FactoriaPlantillas.PORTADA_1_BLANCA :
					case FactoriaPlantillas.PORTADA_1_NEGRO :
					case FactoriaPlantillas.PORTADA_2 :
						mPlantilla.initVistaPlantillaMultimedia(dPlantilla);
						mPlantilla.initVistaCargador(dPlantilla);
						dPlantilla.initControladorCargador(mPlantilla);
						
						mPlantilla.initIdioma(this.idioma);
						mPlantilla.initLiteralesCargador(new CargadorLiterales(this.idioma));
						mPlantilla.initLiteralesEnlace(new EnlaceLiterales(this.idioma));
						mPlantilla.initImagenes(laminaXml.plantilla.imagenes);
						mPlantilla.initTextos(laminaXml.plantilla.textos);
						mPlantilla.initEnlaceUrl(laminaXml.plantilla.enlace == "" ? null : new URLRequest(laminaXml.plantilla.enlace.toString()));
						break;
					case FactoriaPlantillas.PLANTILLA_GALERIA_TEXTO :
						mPlantilla.initVistaPlantillaGaleria(dPlantilla);
						dPlantilla.initControladorPlantillaGaleria(mPlantilla);
						mPlantilla.initVistaCargador(dPlantilla);
						dPlantilla.initControladorCargador(mPlantilla);
						mPlantilla.initVistaGaleriaTexto(dPlantilla);

						mPlantilla.initIdioma(this.idioma);
						mPlantilla.initLiteralesCargador(new CargadorLiterales(this.idioma));
						mPlantilla.initImagenes(laminaXml.plantilla.imagenes);
						mPlantilla.initTextos(laminaXml.plantilla.textos);						
						dPlantilla.initEvents();
						break;
					case FactoriaPlantillas.PLANTILLA_GALERIA :
						mPlantilla.initVistaPlantillaGaleria(dPlantilla);
						dPlantilla.initControladorPlantillaGaleria(mPlantilla);
						mPlantilla.initVistaCargador(dPlantilla);
						dPlantilla.initControladorCargador(mPlantilla);

						mPlantilla.initIdioma(this.idioma);
						mPlantilla.initLiteralesCargador(new CargadorLiterales(this.idioma));
						mPlantilla.initImagenes(laminaXml.plantilla.imagenes);
						dPlantilla.initEvents();
						break;
					case FactoriaPlantillas.PLANTILLA_MAPA :
						dPlantilla.initControladorPlantillaMapa(mPlantilla);
						mPlantilla.initVistaPlantillaMapa(dPlantilla);
						dPlantilla.initMap();
						mPlantilla.setCoordenadas(new LatLng(laminaXml.plantilla.latitud,laminaXml.plantilla.longitud), laminaXml.plantilla.zoom);
						break;
					case FactoriaPlantillas.PLANTILLA_MAPA_TEXTOS :
						mPlantilla.initVistaPlantillaMultimedia(dPlantilla);
						mPlantilla.initVistaCargador(dPlantilla);
						dPlantilla.initControladorCargador(mPlantilla);
						
						dPlantilla.initControladorPlantillaMapa(mPlantilla);
						mPlantilla.initVistaPlantillaMapa(dPlantilla);
						
						mPlantilla.initIdioma(this.idioma);
						mPlantilla.initLiteralesCargador(new CargadorLiterales(this.idioma));
						mPlantilla.initLiteralesEnlace(new EnlaceLiterales(this.idioma));
						mPlantilla.initTextos(laminaXml.plantilla.textos);
						
						dPlantilla.initMap();
						mPlantilla.setCoordenadas(new LatLng(laminaXml.plantilla.latitud,laminaXml.plantilla.longitud), laminaXml.plantilla.zoom);
						break;
					case FactoriaPlantillas.PLANTILLA_REPRODUCTOR :
						mPlantilla.initVistaPlantillaReproductor(dPlantilla);
						dPlantilla.initControladorPlantillaReproductor(mPlantilla);
						dPlantilla.initEvents();
						mPlantilla.initUrlVideo(new URLRequest(laminaXml.plantilla.video));
						mPlantilla.readyVideo();
						break;
					case FactoriaPlantillas.PLANTILLA_REPRODUCTOR_TEXTO :
						mPlantilla.initVistaPlantillaReproductor(dPlantilla);
						dPlantilla.initControladorPlantillaReproductor(mPlantilla);
						dPlantilla.initEvents();
						mPlantilla.initUrlVideo(new URLRequest(laminaXml.plantilla.video));
						mPlantilla.readyVideo();
						mPlantilla.initVistaPlantillaReproductorTexto(dPlantilla);
						mPlantilla.initTextos(laminaXml.plantilla.textos);
						break;
				}						
				lamina.setBotonVista(dBoton);
				lamina.setBotonControlador(mBoton);
				lamina.setPlantillaVista(dPlantilla);
				lamina.setPlantillaControlador(mPlantilla);

				tmp.push(lamina);
			}
			return tmp;
		}

		private function pintarPlantillas(plantillas:Array):void {
			var i:int = 10;
			for each (var plantilla:Sprite in plantillas) {
				plantilla.visible = false;
				plantilla.x = 0;
				plantilla.y = ModeloMenu.MENU_HEIGHT;
				var stSize:Point = this.vMenu.getStageSize();
				plantilla.width = stSize.x;
				plantilla.height = stSize.y - ModeloMenu.MENU_HEIGHT;
			}
		}
		private function pintarBotones(botones:Array):void {
			var anchoBoton:Number = this.calcularAnchoBoton();
			var i:Number = 0;
			for each (var boton:DisplayObject in botones) {
				boton.height = ModeloMenu.MENU_HEIGHT;
				boton.width = anchoBoton;
				boton.visible = true;
				boton.x = i;
				boton.y = 0;
				i += anchoBoton + ModeloMenu.ESPACIO_ENTRE_BOTONES;
			}
		}
		private function calcularAnchoBoton():Number {
			var stSize:Point = this.vMenu.getStageSize();
			return (stSize.x - (ModeloMenu.NUMERO_DE_BOTONES - 1) * ModeloMenu.ESPACIO_ENTRE_BOTONES) / ModeloMenu.NUMERO_DE_BOTONES;
		}
	}
}